package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.exception.ServiceException;
import cn.tedu.csmall.product.mapper.CategoryMapper;
import cn.tedu.csmall.product.pojo.dto.CategoryAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.CategoryUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Brand;
import cn.tedu.csmall.product.pojo.entity.Category;
import cn.tedu.csmall.product.pojo.vo.BrandStandardVO;
import cn.tedu.csmall.product.pojo.vo.CategoryListItemVO;
import cn.tedu.csmall.product.pojo.vo.CategoryStandardVO;
import cn.tedu.csmall.product.service.ICategoryService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 类别模块的业务层
 * @author XingHaiYang
 * @date 2022/11/1 10:18
 */
@Service
@Slf4j
public class CategoryServiceImpl implements ICategoryService {
    /**
     * 依赖注入进类别模块的持久层对象
     */
    @Autowired
    private CategoryMapper mapper;

    /**
     * 新增类别业务层功能
     * @param categoryAddNewDTO 接收到的新增类别参数
     */
    public void addNew(CategoryAddNewDTO categoryAddNewDTO){
        log.debug("新增类别业务层功能开始，接收到的新增类别的参数为={}",categoryAddNewDTO);
        String name = categoryAddNewDTO.getName();
        log.debug("新增类别参数中的名字为={}",name);
        long count = mapper.countByName(name);
        log.debug("新增类别之前先检查一下数据表中是否有此数据，不允许重复数据，查询的数量为={}",count);
        if(count>0){
            String message = "新增类别失败，此类别名【"+name+"】已经被占用";
            log.debug(message);
            throw new ServiceException(message);
        }
        Category category = new Category();
        BeanUtils.copyProperties(categoryAddNewDTO, category);
        int rows = mapper.insert(category);
        log.debug("新增类别成功，新增数量为={}",rows);
        if(rows != 1){
            String message = "新增类别失败，服务器忙，请稍后再试！";
            log.error(message);
            throw new ServiceException(message);
        }
    }

    /**
     * 根据id删除类别功能
     * @param id 需要删除的类别id
     */
    @Override
    public void deleteById(Long id) {
        log.debug("删除类别开始，接收到的id值={}",id);
        //删除之前先做查询，如果没有此数据，则抛出异常
        CategoryStandardVO result = mapper.getStandardById(id);
        if(result == null){
            String message = "此【id】对应的数据不存在";
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        // 如果有此数据，则正常删除
        int rows = mapper.deleteById(id);
        log.debug("删除类别完成，返回的受影响的行数={}",rows);
    }

    /**
     * 根据id编辑类别
     * @param id
     * @param categoryUpdateDTO
     */
    @Override
    public void updateById(Long id, CategoryUpdateDTO categoryUpdateDTO) {
        log.debug("编辑类别功能开始,接收到的id值为",id);
        // 修改之前先进行查询，如果数据不存在，抛出异常
        CategoryStandardVO result = mapper.getStandardById(id);
        if(result == null){
            String message = "此数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        // 如果数据存在，则进行正常编辑品牌功能
        Category category = new Category();
        BeanUtils.copyProperties(categoryUpdateDTO,category);
        category.setId(id);
        log.debug("修改参数为{}",category);
        int rows = mapper.updateById(category);
        if(rows != 1){
            String message = "修改数据失败，服务器忙";
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    /**
     * 查询类别列表
     * @return
     */
    @Override
    public List<CategoryListItemVO> list() {
        List<CategoryListItemVO> list = mapper.list();
        return list;
    }
}
